○MFC SDIにて画面描画と印刷処理

■画面と別の印刷

MFC SDIでは ○○○View::OnDraw(CDC* pDC) の描画関数が
画面描画と印刷描画が共通になっていますので、
画面と別の印刷をしたい場合は IsPrinting にて処理を分ける必要があります

void ○○○View::OnDraw(CDC* pDC)
{
	CFffffffDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(pDC->IsPrinting()){
		//印刷描画
		pDC->TextOut(0,0,"印刷描画");
	}else{
		//画面描画
		pDC->TextOut(0,0,"画面描画");
	}
}

■複数ページの印刷

@SetMaxPageにて印刷するページ数を指定します。

BOOL ○○○::OnPreparePrinting(CPrintInfo* pInfo)
{
	pInfo->SetMaxPage(2);
	return DoPreparePrinting(pInfo);
}

AOnPrintメッセージハンドラを追加します
m_nCurPageにて現在印刷中のページ数が解りますので
ページ数にあわせて描画します。

void ○○○View::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{
	switch (pInfo->m_nCurPage){//現在のページのカウンタ
	case 1://1ページ目の印刷
		pDC->TextOut(0,0,"印刷用描画1ページ目");
		break;
	case 2://2ページ目の印刷
		pDC->TextOut(0,0,"印刷用描画2ページ目");
		break;
	}
	
	CView::OnPrint(pDC, pInfo);
} 


■描画サイズを求めるには

void ○○○::OnDraw(CDC* pDC)
{
	CAaaaDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(pDC->IsPrinting()){
		//印刷描画

		//用紙のサイズ(ピクセル数)を求める
		int width = pDC->GetDeviceCaps(PHYSICALWIDTH);
		int height = pDC->GetDeviceCaps(PHYSICALHEIGHT);

		//オフセットをマイナスする
		width=width - pDC->GetDeviceCaps(PHYSICALOFFSETX)*2;
		height=height - pDC->GetDeviceCaps(PHYSICALOFFSETY)*2;

		pDC->Ellipse(0,0,width,height);//用紙いっぱいに円を書く

	}else{
		//画面描画
		CRect rect;
		GetClientRect(&rect);
		pDC->Ellipse(rect.top,rect.left,rect.right,rect.bottom);//画面いっぱいに円を書く
	}
}

■用紙サイズ(ミリ)を求める

	//用紙のサイズ(ピクセル数)を求める
	int width = pDC->GetDeviceCaps(PHYSICALWIDTH);
	int height = pDC->GetDeviceCaps(PHYSICALHEIGHT);

	//プリンタの1インチあたりのピクセル数を求める
	int PrX_i = pDC->GetDeviceCaps(LOGPIXELSX); 
	int PrY_i = pDC->GetDeviceCaps(LOGPIXELSY);
  
	//ミリ単位になおす
	int right = (int )(double(((double )width / (double)PrX_i) * 25.4 + .5));
	int bottom = (int )(double(((double )height / (double)PrY_i) * 25.4 + .5));

	TRACE("用紙サイズ  %d : %d\n",right,bottom);



▲トップページ > Windows と C++